package com.stephen.data.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;

/**
 * @author: stephen
 * @create: 2020-01-31 14:49
 * @description: 冒泡排序
 */
public class BubbleSort {

    static int[] arr = {1, 2,3};

    public static void main(String[] args) {

        int[] newArr = switchArr(arr);
        // print(newArr);
        // 测试排序速度
        // 创建一个80000个随机数的数组
        int[] arrTest = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arrTest[i] = (int)(Math.random() * 80000000);
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // System.out.println("排序前的时间: " + dateFormat.format(new Date()));
        long start = System.nanoTime();
        switchArr(arrTest); // 12秒
        long end = System.nanoTime();
        System.out.printf("排序用时为[%d]秒",(end - start)/1_000_000_000);
    }

    /**
     * 大的循环次数为数组长度-1
     * 小的循环次数,是递减的
     * 有一个优化,某次循环,未发生交换,说明数组已经有序,则直接停止排序
     * 加一个标识变量
     * @param arr
     * @return
     */
    public static int[] switchArr(int[] arr) {

        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = false; // 是否进行过交换
            for (int j = 0;j < arr.length - 1 - i;j++) {
                if (arr[j] > arr[j+1]) {
                    flag = true;
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            // System.out.printf("第[%d]次排序",i + 1);
            // System.out.println(Arrays.toString(arr));
            if (!flag) {
                break;
            }
        }
        return arr;
    }

    public static void print(int[] arr) {
        // for (int i = 0; i < arr.length; i++) {
        //     System.out.print(arr[i] + ",");
        // }
        System.out.println(Arrays.toString(arr));
    }

}
